Micron Document
rns.moscow 🟥 [git]

Node / public / rns-wardrive-tools / files / plugin / wardrive_plugin.py

Displaying Raw • Download

plugin/wardrive_plugin.py 5fc5be0a3a97bf8e793fe9e92ffffac45a4b6fd2 (5fc5be0a) Text, 8.01 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787json
Tff7b72import T7ee787math
Tff7b72import T7ee787struct
Tff7b72import T7ee787threading
Tff7b72import T7ee787time

Tff7b72import T7ee787RNS

Te6edf3CONFIG_FILENAME Tff7b72= Ta5d6ff"Ta5d6ffwardrive_config.jsonTa5d6ff"
Te6edf3MIN_ANNOUNCE_INTERVAL Tff7b72= T79c0ff15 T8b949e# minimum auto-mode announce interval in seconds
Te6edf3MIN_ANNOUNCE_DISTANCE Tff7b72= T79c0ff10 T8b949e# minimum movement in meters before a new announce is sent (auto mode only)

T8b949e# Announce mode payload: lat + lon
Te6edf3ANNOUNCE_PAYLOAD_FMT Tff7b72= Ta5d6ff"Ta5d6ff>ffTa5d6ff"

T8b949e# Packet mode payload: lat + lon + 16-byte sender hash
Te6edf3PACKET_PAYLOAD_FMT Tff7b72= Ta5d6ff"Ta5d6ff>ff16sTa5d6ff"


Tff7b72class T56d364WardrivPluginTb4b4b4(Te6edf3SidebandServicePluginTb4b4b4)Tb4b4b4:
Te6edf3service_name Tff7b72= Ta5d6ff"Ta5d6ffwardriveTa5d6ff"

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_config Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_beacon_dest Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_last_send Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_trigger Tff7b72= Te6edf3threadingTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_patched Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_last_lat Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_last_lon Tff7b72= Tff7b72None

Tff7b72tryTb4b4b4:
Te6edf3sb Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_sidebandTb4b4b4(Tb4b4b4)
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3sbTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcommand_plugins_pathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3CONFIG_FILENAMETb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_config Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadTb4b4b4(Te6edf3fTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] config: interval=Tffd700{Tff7b72selfTff7b72.Td2a8ff_intervalTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ffs mode=Tffd700{Tff7b72selfTff7b72.Td2a8ff_modeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff send=Tffd700{Tff7b72selfTff7b72.Td2a8ff_send_modeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72except Tf85149FileNotFoundErrorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] no config file, using defaultsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] config error: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3sb Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_sidebandTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_beacon_dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3sbTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Ta5d6ff"Ta5d6ffwardriveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbeaconTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] beacon: Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_beacon_destTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] failed to create beacon destination: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_send_modeTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffpacketTa5d6ff"Tb4b4b4:
Tff7b72for Te6edf3h Tff7b72in Tff7b72selfTff7b72.Td2a8ff_bot_hashesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] path request sent for Tffd700{Te6edf3hTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff…Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] path request failed for Tffd700{Te6edf3hTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff…: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffservice_jobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] service startedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_triggerTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_threadTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_threadTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] service stoppedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_intervalTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Tffa657maxTb4b4b4(Te6edf3MIN_ANNOUNCE_INTERVALTb4b4b4, Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_configTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffannounce_interval_secsTa5d6ff"Tb4b4b4, T79c0ff30Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72return T79c0ff30

Tff7b72def Td2a8ff_modeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_configTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffannounce_modeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ff_send_modeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_configTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsend_modeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ff_bot_hashesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3raw Tff7b72= Tff7b72selfTff7b72.Td2a8ff_configTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbot_hashesTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3rawTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3raw Tff7b72= Tb4b4b4[Te6edf3rawTb4b4b4]
Te6edf3cleaned Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3h Tff7b72in Te6edf3rawTb4b4b4:
Te6edf3h Tff7b72= Te6edf3hTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff<Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff>Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3hTb4b4b4:
Te6edf3cleanedTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72return Te6edf3cleaned

Tff7b72def Td2a8ff_install_announce_hookTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3sb Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_sidebandTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tffa657callableTb4b4b4(Tffa657getattrTb4b4b4(Te6edf3sbTb4b4b4, Ta5d6ff"Ta5d6fflxmf_announceTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] lxmf_announce not foundTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Te6edf3original Tff7b72= Te6edf3sbTff7b72.Td2a8fflxmf_announce
Te6edf3plugin Tff7b72= Tff7b72self
Tff7b72def Td2a8ffhookedTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3originalTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] announce detected — firing beaconTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3pluginTff7b72.Td2a8ff_triggerTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3result
Te6edf3sbTff7b72.Td2a8fflxmf_announce Tff7b72= Te6edf3hooked
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] announce hook installedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] hook install failed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffservice_jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] service_jobs running, mode=Tffd700{Tff7b72selfTff7b72.Td2a8ff_modeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_modeTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmanualTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_patchedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_patched Tff7b72= Tff7b72selfTff7b72.Td2a8ff_install_announce_hookTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_triggerTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff1.0Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_triggerTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_triggerTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72- Tff7b72selfTff7b72.Td2a8ff_last_send Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_intervalTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_send Tff7b72= Te6edf3now
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] error: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ff_distance_mTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lat1Tb4b4b4, Te6edf3lon1Tb4b4b4, Te6edf3lat2Tb4b4b4, Te6edf3lon2Tb4b4b4)Tb4b4b4:
Te6edf3dlat Tff7b72= Tb4b4b4(Te6edf3lat2 Tff7b72- Te6edf3lat1Tb4b4b4) Tff7b72* T79c0ff111320
Te6edf3dlon Tff7b72= Tb4b4b4(Te6edf3lon2 Tff7b72- Te6edf3lon1Tb4b4b4) Tff7b72* T79c0ff111320 Tff7b72* Te6edf3mathTff7b72.Td2a8ffcosTb4b4b4(Te6edf3mathTff7b72.Td2a8ffradiansTb4b4b4(Te6edf3lat1Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3mathTff7b72.Td2a8ffsqrtTb4b4b4(Te6edf3dlat Tff7b72*Tff7b72* T79c0ff2 Tff7b72+ Te6edf3dlon Tff7b72*Tff7b72* T79c0ff2Tb4b4b4)

Tff7b72def Td2a8ff_get_locationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3sb Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_sidebandTb4b4b4(Tb4b4b4)
Te6edf3location Tff7b72= Tff7b72None
Tff7b72if Te6edf3sbTff7b72.Td2a8fftelemeter Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3sbTff7b72.Td2a8fftelemeterTff7b72.Td2a8ffenableTb4b4b4(Ta5d6ff"Ta5d6fflocationTa5d6ff"Tb4b4b4)
Te6edf3location Tff7b72= Te6edf3sbTff7b72.Td2a8fftelemeterTff7b72.Td2a8ffreadTb4b4b4(Ta5d6ff"Ta5d6fflocationTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3location Tff7b72is Tff7b72None Tff7b72and Te6edf3sbTff7b72.Td2a8fflatest_telemetry Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3location Tff7b72= Te6edf3sbTff7b72.Td2a8fflatest_telemetryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflocationTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3location

Tff7b72def Td2a8ff_sendTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_beacon_dest Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return

Te6edf3location Tff7b72= Tff7b72selfTff7b72.Td2a8ff_get_locationTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3location Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] no location (enable telemetry+location in Sideband settings)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return

Te6edf3lat Tff7b72= Tffa657floatTb4b4b4(Te6edf3locationTb4b4b4[Ta5d6ff"Ta5d6fflatitudeTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3lon Tff7b72= Tffa657floatTb4b4b4(Te6edf3locationTb4b4b4[Ta5d6ff"Ta5d6fflongitudeTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_modeTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffautoTa5d6ff" Tff7b72and Tff7b72selfTff7b72.Td2a8ff_last_lat Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3dist Tff7b72= Tff7b72selfTff7b72.Td2a8ff_distance_mTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_last_latTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_last_lonTb4b4b4, Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4)
Tff7b72if Te6edf3dist Tff7b72< Te6edf3MIN_ANNOUNCE_DISTANCETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] skipped, only moved Tffd700{Te6edf3distTffd700:Ta5d6ff.1fTffd700}Ta5d6ffmTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_send_modeTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffpacketTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_packetTb4b4b4(Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_announceTb4b4b4(Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_last_lat Tff7b72= Te6edf3lat
Tff7b72selfTff7b72.Td2a8ff_last_lon Tff7b72= Te6edf3lon

Tff7b72def Td2a8ff_send_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3ANNOUNCE_PAYLOAD_FMTTb4b4b4, Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_beacon_destTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3app_dataTff7b72=Te6edf3payloadTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] announced (Tffd700{Te6edf3latTffd700:Ta5d6ff.5fTffd700}Ta5d6ff, Tffd700{Te6edf3lonTffd700:Ta5d6ff.5fTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72def Td2a8ff_send_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4)Tb4b4b4:
Te6edf3hashes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_bot_hashesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3hashesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[wardrive] bot_hashes not set in config, canTa5d6ff'Ta5d6fft send packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return

Te6edf3payload Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3PACKET_PAYLOAD_FMTTb4b4b4, Te6edf3latTb4b4b4, Te6edf3lonTb4b4b4, Tffa657bytesTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_beacon_destTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3bot_hash_hex Tff7b72in Te6edf3hashesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3bot_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3bot_hash_hexTb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] invalid bot_hash: Tffd700{Te6edf3bot_hash_hexTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72continue

Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3bot_hashTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3bot_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] Tffd700{Te6edf3bot_hash_hexTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff… identity unknown, path requested — will retry next cycleTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72continue

Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffwardriveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcollectorTa5d6ff"Tb4b4b4)
Te6edf3packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3destTb4b4b4, Te6edf3payloadTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff[wardrive] packet sent to Tffd700{Te6edf3bot_hash_hexTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff… (Tffd700{Te6edf3latTffd700:Ta5d6ff.5fTffd700}Ta5d6ff, Tffd700{Te6edf3lonTffd700:Ta5d6ff.5fTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)


Te6edf3plugin_class Tff7b72= Te6edf3WardrivPlugin

Served by rngit 1.5.0 - Generated in 0.04s